package c03数据类型和运算符;

/**
 * 不能用循环和本地变量（就是局部变量），对一个整形n，实现输出n,2n,4n,...
 * 当大于max(比如5000)时再逆向输出...4n,2n,n。
 * 解决方法：用两个递归+成员变量搞定！
 * <p>
 * 这几天关于这个问题不同人有不同解法，但是不少人（包括我）对变量分类理解很模糊~
 * 我翻了一下Java疯狂讲义终于明白了！
 * 在Java中，根据定义变量位置的不同，将变量分为两大类——成员变量和局部变量
 * 成员变量：实例变量（即类中不以static修饰的变量）、类属性（即类中以static修饰的变量）。
 * 局部变量：形参、方法里定义的变量、代码块中定义的变量（静态或非静态代码块都是）。
 * 所以，这下知道这道题的意思了吧？
 *
 * @author 炜sama
 */
public class 递归中的递归与变量分类 {

	static final int n = 8;
	static int sum = n;
	static int max = 5000;

	public static void printMul() {//乘以2递归
		System.err.println(sum);
		if (2 * sum > max) //递归终点，进入另一个递归
			printDiv();
		else {
			sum *= 2;
			printMul();
		}
	}

	public static void printDiv() {//除以2递归
		System.err.println(sum);
		if (sum != n) {//不符合这个条件的话就是递归终点了~
			sum /= 2;
			printDiv();
		}
	}

	//其实还有一个递归可以解决的方法！这是小黑的解法：
	public static void print() {
		System.err.println(sum);
		if (2 * sum < max) {
			sum *= 2;
			print();
		}
		System.err.println(sum);
		sum /= 2;
	}

	//如果可以使用本地变量那就简单得多啦~
	public static void show(int n, int max) {
		if (n <= max) {
			System.err.println(n);
			show(n * 2, max);
			System.err.println(n);
		}
	}

	public static void main(String[] args) {
//		printMul();//符合题目要求的解法
//		print();
		show(8, 5000);
	}

}
